iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
DevOps

為你自己架 Server系列 第 2

D2 Service

  • 分享至 

  • xImage
  •  

Service 是什麼?

在這個系列的文章中,我們將主要討論各種服務(Service)。因此,在開始之前,讓我們先了解服務的本質是什麼。

在類 Unix 系統中,我們經常聽到 daemon 這個詞,它指的是在背景持續運行的程式。這些程式的名稱通常以字母 d 作為結尾,例如網頁伺服器的 httpd 或管理 cron 作業的 crond。您可以使用 htop 指令查看具有 d 結尾的程式,通常它們就是 daemon。

事實上,Service 本質上就是一種 daemon,因為它們必須持續運行(例如,網頁伺服器必須持續監聽 80 port,隨時處理傳入的 HTTP 請求)。

管理 Service

在 Debian 系統裡面,我們可以使用 systemctl 指令來管理 service,以網頁伺服器 nginx 為例:

打開 service

$ systemctl start nginx

關閉 service

$ systemctl stop nginx

看 service 的狀態

$ systemctl status nginx

重啟 service

$ systemctl restart nginx

啟用及停用 service,啟用的話該 service 會在開機時自動開啟

$ systemctl enable nginx
$ systemctl disable nginx

撰寫 Service

我們的服務將由 systemd 管理,因此必須符合其格式。設定檔具有許多可設定的選項,以下是一個簡單的範例:

[Unit]
Description=Test Server
Documentation=https://example.com
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/start.sh
PIDFile=/var/run/test-server.pid
ExecStop=/usr/bin/stop.sh

[Install]
WantedBy=multi-user.target
  • Description
    • service 的描述
  • Documentation
    • 文件的位置
  • After
    • 指定在哪些服務啟動後才能啟動這個服務,例如在啟動我們的伺服器之前,需要先啟動網路服務
    • 也有 Before 選項
  • Type
  • ExecStart / ExecStop
    • 他會指定當執行 systemctl start nginx 的時候要執行哪些程式
    • 這邊的 start.sh 裡面會放啟動服務所需的程式碼,例如說這是一個 Flask 專案,那可能就是 flask run 之類的
  • PIDFile
    • 這個 service 的 PID 會被記在哪個檔案中
  • WantedBy
    • 基本上就設定成 multi-user.target 即可
    • 剩下的可以參考 https://unix.stackexchange.com/a/506372 ,裡面有列出一些可用的選項,除非有特殊需求不然不太需要更改

最後我們來看一個現有的 service:

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target

[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

這是 sshd 的 service 設定檔,這裡有幾個上面沒有提到的東西,去看文件基本上也可以知道他們的功能,例如

  • Type=notify
    • 根據文件,這個 type 和 simple 類似,但他會在 service 啟動完成之後通知 systemd
  • KillMode=process
    • 當 service 關掉的時候,他只會把 main process 砍掉,而 child process 不會
    • 這就是為什麼當我們 systemctl restart sshd 的時候現有的 ssh 連線不會斷的原因
  • etc.

參考資料


上一篇
D1 Introduction
下一篇
D3 PAM
系列文
為你自己架 Server8
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言